package top.gytf.unifiedcall.model.code;

import cn.hutool.core.text.CharSequenceUtil;

/**
 * 状态编码
 * <p>
 * 组合命名空间、符号码，代表一个完整的唯一状态。
 * <p>
 * 描述为：在{@link #namespace()}下，产生了一个具体状态，代表{@link #symbol()}
 */
public interface StatusCode extends Code {
    /**
     * 分割各个组成部分编码的分隔符
     */
    String DELIMITER = "-";

    /**
     * 状态码的所属命名空间
     */
    NamespaceCode namespace();

    /**
     * 指示状态码代表的语义
     */
    SymbolCode symbol();

    /**
     * 状态唯一标识，用于区分状态，需要保证在命名空间下唯一
     */
    String serial();

    /**
     * 状态描述信息
     */
    String message();

    @Override
    default String value() {
        return namespace().value() + DELIMITER + symbol().value() + DELIMITER + serial();
    }

    @Override
    default boolean validate() {
        // 各组成部分通过校验
        if (!(namespace().validate() && symbol().validate() && CharSequenceUtil.isNotEmpty(serial()))) {
            return false;
        }
        // 各组成部分不含分隔符
        return !namespace().value().contains(DELIMITER) && !symbol().value().contains(DELIMITER)
                && !serial().contains(DELIMITER);
    }
}
